﻿using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.Unity;


namespace Ipepper.EnvioEmail.Negocio
{
   
    public sealed class SqlDatabase
    {

        private Database ObjDataBase;

        /// <summary>
        /// Encapsula o acesso ao banco de dados.
        /// </summary>
        [InjectionConstructor]
        public SqlDatabase([Dependency]Database objDatabase)
        {
            this.ObjDataBase = objDatabase;

        }

        /// <summary>
        /// Cria o comando da procedure inserindo os parâmetros necessários na procedure
        /// </summary>
        /// <param name="procedureName">Nome da "procedure" para execução</param>
        /// <param name="parameters">Matriz de parâmetros de entrada da "procedure"</param>
        private DbCommand Command(string procedureName, SqlParameter[] parameters)
        {
           
            DbCommand dbCommand = ObjDataBase.GetStoredProcCommand(procedureName);
            foreach (SqlParameter paran in parameters) {
                this.ObjDataBase.AddInParameter(dbCommand, paran.ParameterName, paran.DbType, paran.Value);
            }
            //dbCommand.Parameters.AddRange(parameters);
            return dbCommand;
           
        }

        /// <summary>
        /// Executa consulta via "procedure" com retorno completo
        /// </summary>
        /// <param name="procedureName">Nome da "procedure" para execução</param>
        /// <param name="parameters">Matriz de parâmetros de entrada da "procedure"</param>
        /// <returns>Retorna um tipo DataSet</returns>
        public DataSet ExecuteDataSet(string procedureName, SqlParameter[] parameters)
        {
            
            return this.ObjDataBase.ExecuteDataSet(Command(procedureName, parameters));
            
        }

        /// <summary>
        /// Execução de um comando "ExecuteNonQuery"
        /// </summary>
        /// <param name="procedureName">Nome da "procedure" para execução</param>
        /// <param name="parameters">Matriz de parâmetros de entrada da "procedure"</param>
        /// <returns>Retorna a quantidade de linhas afetadas na execução</returns>
        public int ExecuteNonQuery(string procedureName, SqlParameter[] parameters)
        {
           
            return this.ObjDataBase.ExecuteNonQuery(Command(procedureName, parameters));
          
        }

        /// <summary>
        /// Execução de um comando "ExecuteScalar"
        /// </summary>
        /// <param name="procedureName">Nome da "procedure" para execução</param>
        /// <param name="parameters">Matriz de parâmetros de entrada da "procedure"</param>
        /// <returns>Retorna a quantidade de linhas afetadas na execução</returns>
        public object ExecuteScalar(string procedureName, SqlParameter[] parameters)
        {
           
            return this.ObjDataBase.ExecuteScalar(Command(procedureName, parameters));
           
        }

        /// <summary>
        /// Execução de um comando "ExecuteReader"
        /// </summary>
        /// <param name="procedureName">Nome da "procedure" para execução</param>
        /// <param name="parameters">Matriz de parâmetros de entrada da "procedure"</param>
        /// <returns>Retorna o tipo DataReader</returns>
        public IDataReader ExecuteDataReader(string procedureName, SqlParameter[] parameters)
        {
           
            return ObjDataBase.ExecuteReader(Command(procedureName, parameters));
           
        }
                        
    }
}